package com.example.dbsample.util.net;

import com.example.dbsample.filter.XssHttpServletRequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Optional;

/**
 * @author yuzhou
 * @date 2017年8月9日
 * @time 上午11:32:33
 *
 */
@Slf4j
public class WebUtils {
    private WebUtils(){}

    private static final Logger LOGGER = LoggerFactory.getLogger(WebUtils.class);

    /**
     * @return  HttpServletRequest
     */
    public static HttpServletRequest getHttpServletRequest() {
        return Optional.of(RequestContextHolder.getRequestAttributes()).filter(s -> s instanceof ServletRequestAttributes).map(a -> (ServletRequestAttributes)a).map(ServletRequestAttributes::getRequest).orElse(null);
    }

    /**
     * 页面输出
     */
    public static void write(HttpServletResponse response, Object o) {
        try {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            out.println(o.toString());
            out.flush();;
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取httpServletRequest
     */
    public static HttpServletRequest getRequest() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        return new XssHttpServletRequestWrapper(request);
    }

    /**
     * 获取httpServletResponse
     */
    public static HttpServletResponse getResponse() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
    }

    /**
     * 是否为ajax请求
     */
    public static boolean isAjaxRequest(HttpServletRequest request) {
        //String header = request.getHeader("X-Requested-With");
        String header = "x-requested-with";
        String httpRequest = "XMLHttpRequest";
        // 如果是ajax请求响应头会有：x-requested-with
        return request.getHeader(header) != null &&
                request.getHeader(header).equalsIgnoreCase(httpRequest);
    }

    /**
     * 页面输出
     */
    //public static void write(HttpServletResponse response, Object o) {
    //    try {
    //        response.setContentType("text/html;charset=utf-8");
    //        PrintWriter out = response.getWriter();
    //        out.println(o.toString());
    //        out.flush();
    //        out.close();
    //    } catch (IOException e) {
    //        e.printStackTrace();
    //    }
    //}
    //

    public static String getRemoteIP(HttpServletRequest request) {
        String unknown = "unknown";
        String ip = request.getHeader("X-Forwarded-For");
        if(StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if(StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }

        if(StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        return ip;
    }
    /**
     * 获取IP地址
     * 使用Nginx等反向代理软件，则不能通过request.getRemoteAddr()获取IP地址
     * 如果使用了多级反向代理，X-Forwarded-For的值不止一个，而是一串IP地址，X-Forwarded-For中第一个非unknown的有效IP字符串，则为真实IP地址
     *
     */
    public static String getIpAddr(HttpServletRequest request) {
        String ip = null, unknown = "unknown", seperator = ",";
        int maxLength = 15;
        try {
            ip = request.getHeader("x-forwarded-for");
            if(StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if(StringUtils.isEmpty(ip) || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }

            if(StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }

            if(StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }

            if(StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
        } catch (Exception e) {
            LOGGER.error("getIpAddr error", e);
        }

        // 使用代理，则获取第一个IP地址
        if(StringUtils.isEmpty(ip) && ip.length() > maxLength) {
            int idx = ip.indexOf(seperator);
            if(idx > 0) {
                ip = ip.substring(0, idx);
            }
        }

        return ip;
    }

    /**
     * 获取IP地址
     */
    public static String getIpAddr() {
        HttpServletRequest request = WebUtils.getRequest();
        return getIpAddr(request);
    }

    public static void main(String[] args) {
        // 这里
        System.out.println(getIpAddr());
    }
}
